#include <stdio.h>
#include <stdlib.h>

#define MAX 100

// 队列定义
typedef struct {
    int data[MAX];
    int front;
    int rear;
} Queue;

// 初始化队列
void initQueue(Queue* q) {
    q->front = 0;
    q->rear = 0;
}

// 判断队列是否为空
int isEmpty(Queue* q) {
    return q->front == q->rear;
}

// 判断队列是否已满
int isFull(Queue* q) {
    return (q->rear + 1) % MAX == q->front;
}

// 入队
void enqueue(Queue* q, int value) {
    if (!isFull(q)) {
        q->data[q->rear] = value;
        q->rear = (q->rear + 1) % MAX;
    } else {
        printf("队列已满\n");
    }
}

// 出队
int dequeue(Queue* q) {
    if (!isEmpty(q)) {
        int value = q->data[q->front];
        q->front = (q->front + 1) % MAX;
        return value;
    } else {
        printf("队列为空\n");
        return -1;
    }
}

// 栈定义
typedef struct {
    int data[MAX];
    int top;
} Stack;

// 初始化栈
void initStack(Stack* s) {
    s->top = -1;
}

// 判断栈是否为空
int stackIsEmpty(Stack* s) {
    return s->top == -1;
}

// 判断栈是否已满
int stackIsFull(Stack* s) {
    return s->top == MAX - 1;
}

// 压栈
void push(Stack* s, int value) {
    if (!stackIsFull(s)) {
        s->data[++(s->top)] = value;
    } else {
        printf("栈已满\n");
    }
}

// 弹栈
int pop(Stack* s) {
    if (!stackIsEmpty(s)) {
        return s->data[(s->top)--];
    } else {
        printf("栈为空\n");
        return -1;
    }
}

// 逆置队列元素
void reverseQueue(Queue* q) {
    Stack s;
    initStack(&s);

    // 将队列中的元素全部压入栈
    while (!isEmpty(q)) {
        push(&s, dequeue(q));
    }

    // 将栈中的元素重新入队
    while (!stackIsEmpty(&s)) {
        enqueue(q, pop(&s));
    }
}

// 打印队列
void printQueue(Queue* q) {
    int i = q->front;
    while (i != q->rear) {
        printf("%d ", q->data[i]);
        i = (i + 1) % MAX;
    }
    printf("\n");
}

int main() {
    Queue q;
    initQueue(&q);

    // 入队元素
    enqueue(&q, 1);
    enqueue(&q, 2);
    enqueue(&q, 3);
    enqueue(&q, 4);
    enqueue(&q, 5);

    printf("逆置前的队列: ");
    printQueue(&q);

    // 逆置队列
    reverseQueue(&q);

    printf("逆置后的队列: ");
    printQueue(&q);

    return 0;
}
